import http from "./HttpService";
import LocalDataService from "./LocalDataService";
import OptionManageService from "./OptionManageService";
import { getState } from "../store/StoreUtil";
import Config from "../Config";
import LoginReducer from "../store/reducer/LoginReducer";

export default class LoginService{

    // 保存到LocalDataService的key
    static LOGIN_KEY = Config.loginToken;

    /**
     * 登录
     * @param userInfo 用户信息 对象中包含{password, username, verifyCode, verifyId}
     * @returns {Promise<void>} 返回登录用户信息
     */
    static async login(userInfo){
        let {loginFn} = LoginService.getLoginOption();
        let result = await http("/login", {
            body: JSON.stringify(userInfo)
        });
        let token = result.data.accessToken;
        if(!token){
            throw new Error("返回数据异常")
        }
        LocalDataService.setItem(this.LOGIN_KEY, token);
        // 有登录方法则执行
        if(loginFn){
            await loginFn(token, result.data);
        }
        LoginReducer.actions.setValue({userInfo: result.data});
        return result.data;
    }

    /**
     * 退出登录
     */
    static async logout(){
        let {logoutUrl, logoutFn} = LoginService.getLoginOption();
        // 如果有退出登录方法则调用
        if(logoutFn){
            // 返回false则停止后续操作
            if(!(await logoutFn())){
                return;
            }
        }
        LocalDataService.setItem(this.LOGIN_KEY, "");
        // 当有退出链接地址的时候 跳转到链接
        if(logoutUrl){
            window.location.href = logoutUrl;
            return;
        }
        // 还原state,清空缓存
        // initAllState();
        // LocaleService.initLang();
        // MenuService.cleanCache();
        // http.cleanCache();
        // 直接刷新界面
        window.location.reload();
    }

    /**
     * 刷新当前登录状态 返回当前登录用户信息
     */
    static async loadLoginInfo(){
        let {fixToken, loginFn, loadLoginInfoFn} = LoginService.getLoginOption();
        // 传固定token 用于单点登录
        if(fixToken){
            LocalDataService.setItem(this.LOGIN_KEY, fixToken);
        }

        // 有配置则执行配置中的方法
        if(loadLoginInfoFn){
            await loadLoginInfoFn();
        }
        
        // token不存在则直接设置未登录状态
        if(!LocalDataService.getItem(this.LOGIN_KEY)){
            LoginReducer.actions.setValue({userInfo: false});
            return null;
        }
        let result = await http.get("/check_token");
        // 有登录方法则执行
        if(loginFn){
            await loginFn(LocalDataService.getItem(this.LOGIN_KEY), result.data);
        }
        LoginReducer.actions.setValue({userInfo: result.data});
        return result.data;
    }

    /**
     * 获取安全配置信息
     * @return {*|{
     *  fixToken: 固定token,
     *  logoutUrl: 非登录状态跳转链接,
     *  logoutFn: 退出方法，返回false取消默认动作,
     *  loginFn: function(token, userData)登录成功后的事件
     *  loadLoginInfoFn: 刷新当前登录状态时调用的方法
     *  }}
     */
    static getLoginOption() {
        return OptionManageService.getItem(Config.loginEvent) || {};
    }

    /**
     * 获取当前登录用户信息
     * @return {Promise<null>}
     */
    static getLoginInfo(){
        // token不存在则直接设置未登录状态
        return getState(LoginReducer).userInfo;
    }
}